const DB = require('./db')
module.exports = (wss) => {
  // clients:当前在线的用户
  const clients = {}
  let data = {}
  let messageList
  wss.on('connection', async function connection(ws, req) {
    if (req.url.includes('/sendMessages')) {
      // 服务器接收消息
      ws.on('message', async function incoming(message) {
        // 只要建立连接就会走这段代码。后续发消息就不走这段代码了。
        data = JSON.parse(message)
        //保存当前客户端
        clients[data.userid] = ws
        // 私聊
        if (data.type === 'friend') {
          if (data.content) {
            // 向数据库插入消息
            const result = await DB.query(
              'INSERT INTO `my_app`.`friend_message`(`fromid`, `toid`, `content`, `createTime`, `type`)' +
                `VALUES ('${data.userid}', '${data.to}', '${data.content}', now(), 'text');`
            )
          }
          // 用来更新已读消息的消息
          if (data.progress === 'updateLatestSeq') {
            console.log('2478927')
            DB.query(
              `update  friend_message  SET readStatus=1 where
              ((fromid='${data.userid}' AND toid='${data.to}') OR 
              (fromid='${data.to}' AND toid='${data.userid}')) AND (id<=${data.latestSeq})`
            )
          } else {
            // 发送给客户端
            // 查询数据库里所有消息
            messageList = await DB.query(
              `select fm.*, fromUser.username as fromName, toUser.username as toName, fromUser.avatar as fromAvatar, toUser.avatar as toAvatar
             from friend_message fm JOIN user fromUser ON fromUser.userid = fm.fromid
             JOIN user toUser on toUser.userid = fm.toid where (fm.fromid='${data.userid}' AND fm.toid='${data.to}') OR (fm.fromid='${data.to}' AND fm.toid='${data.userid}') order by id asc`
            )
            // 需要给to客户端发消息， 需要判断to客户端在不在线
            if (clients[data.to] == undefined) {
            } else {
              // 如果好友在线, 发送给好友最新消息列表
              console.log('发消息')
              clients[data.to].send(JSON.stringify(messageList))
            }
            // 发送给自己用来更新消息列表
            ws.send(JSON.stringify(messageList), (err) => {
              if (err) {
                console.log(`[SERVER] error: ${err}`)
              }
            })
          }
        } else if (data.type === 'group') {
          // 群聊
          if (data.content) {
            // 向数据库插入消息
            const result = await DB.query(
              'INSERT INTO `my_app`.`group_message`(`userid`, `groupid`, `content`, `createTime`, `type`)' +
                `VALUES ('${data.userid}', '${data.to}', '${data.content}', now(), 'text');`
            )
          }
          // 用来更新已读消息的消息
          // user_group表中，readSchedule更新为消息的id,表示已经读到这条消息了
          if (data.progress === 'updateLatestSeq') {
            DB.query(
              `update  user_group  SET readSchedule=${data.latestSeq} where (userid='${data.userid}' AND groupid='${data.to}')`
            )
          } else {
            // 发送给客户端
            // 查询数据库里所有消息
            messageList = await DB.query(
              `select gm.*, fromUser.username as fromName, toUser.username as toName, fromUser.avatar as fromAvatar, toUser.avatar as toAvatar
             from group_message gm JOIN user fromUser ON fromUser.userid = gm.userid
             JOIN user toUser on toUser.userid = gm.userid where (gm.groupid='${data.to}') order by id asc`
            )
            // 发送给所有在线的好友，用于实时更新
            // 查询to（群id）所有的群成员，然后遍历每一个判断在不在线，在线就发送消息
              members = await DB.query(
                `select userid from user_group where groupid='${data.to}' `
              )
              for(let id of members){
                // 需要给to客户端发消息， 需要判断to客户端在不在线
                if (clients[id] == undefined) {
                } else {
                  // 如果好友在线, 发送给好友最新消息列表
                  console.log('发消息')
                  clients[id].send(JSON.stringify(messageList))
                }
              }
            // 发送给自己用来更新消息列表
            ws.send(JSON.stringify(messageList), (err) => {
              if (err) {
                console.log(`[SERVER] error: ${err}`)
              }
            })
          }
        }
      })
      // 关闭连接
      ws.on('close', function () {
        console.log('关闭链接')
      })
    }
  })
}
